package futbol.tacticas.concursantes2007.Leito;

import futbol.tacticas.Comando;
import futbol.tacticas.ComandoGolpearBola;
import futbol.tacticas.ComandoIrA;
import futbol.tacticas.ComandoPase;
import futbol.tacticas.ComandoTiroAPuerta;
import futbol.tacticas.SituacionJugadores;
import futbol.tacticas.concursantes.Tactica;

import java.awt.*;
import java.util.*;


public class TacticaLeito implements Tactica{
    private int valores[][]={
        {-150,0,5}, //arquero
        {-110,11,6}, //defensa
        {-110,-11,6},  //defensa
        {-100,-32,6},   //defensa
        {-100,32,6},    //defensa
        {-10,30,7},      //volante
        {-10,-30,7},    //volante
        {10,0,4},      //volante
        {105,-40,7} ,   //delantero
        {120,0,6},     //delantero
        {100,40,7}     //delantero
    };
    public String getNombre() {
        return "Leito";
    }
    public Color getColor1() {
        return Color.RED;
    }
    public Color getColor2() {
        return Color.BLACK;
    }
    public Color getColorNumero() {
        return Color.GREEN;
    }
    public int getFuerza(int n){
        return valores[n][2];
    }
    public int getXInicial(int n){
        return valores[n][0];
    }
    public int getYInicial(int n){
        return valores[n][1];
    }
    public Vector<Comando> getComandos(SituacionJugadores sj) {
        Vector<Comando> retorno=new Vector();
        Point[] losOtros;
        Point[] losMios;
        Point bola;
        Point[] vector;
        Vector cubiertos=new Vector();
        retorno.clear();
        cubiertos.clear();
        losOtros =sj.getContrario();
        bola=sj.getBola();
        losMios=sj.getMisJugadores();
        int y=(int)(bola.getY()/2);
        if (y<-25) y=-25;
        if (y>25) y=25;
        retorno.add(new ComandoIrA(0,valores[0][0], y));
        
        vector=jugadoresEn(-160,-55,losOtros);
        if (vector.length>0){
            int[] mios = { 1,2, 3};
            int jugCubre;
            for (int n=0;n<vector.length;n++){
                jugCubre=losOtrosCerca(vector[n],mios,cubiertos,sj);
                Point mejorDef=posicionDefensa(vector[n],bola);
                retorno.add(new ComandoIrA(jugCubre,mejorDef.getX(),mejorDef.getY()));
            }
            for (int n=1;n<5;n++)
                if (!cubiertos.contains(n))
                    retorno.add(new ComandoIrA(n,valores[n][0],valores[n][1]));
        } else{
            for (int n=1;n<5;n++){
                retorno.add(new ComandoIrA(n,valores[n][0],valores[n][1]));
            }
        }
        if (bola.getY()>0){
            retorno.add(new ComandoIrA(4,getXInicial(4),15));
            retorno.add(new ComandoIrA(7,getXInicial(7),15));
        } else{
            retorno.add(new ComandoIrA(4,getXInicial(4),-15));
            retorno.add(new ComandoIrA(7,getXInicial(7),15));
        }
        cubiertos.clear();
        
        vector=jugadoresEn(-70,30,losOtros);
        if (vector.length>0){
            int[] mios = { 5,6};
            int jugCubre;
            for (int n=0;n<vector.length;n++){
                jugCubre=losOtrosCerca(vector[n],mios,cubiertos,sj);
                Point mejorDef=posicionDefensa(vector[n],bola);
                retorno.add(new ComandoIrA(jugCubre,mejorDef.getX(),mejorDef.getY()));
            }
            for (int n=5;n<7;n++)
                if (!cubiertos.contains(n))
                    retorno.add(new ComandoIrA(n,valores[n][0],valores[n][1]));
            
        } else{
            for (int n=5;n<7;n++)
                retorno.add(new ComandoIrA(n,valores[n][0],valores[n][1]));
        }
        cubiertos.clear();
        if (bola.x>-20)
            retorno.add(new ComandoIrA(7,bola.x,bola.y));
        else
            retorno.add(new ComandoIrA(7,valores[7][0],bola.y));
        
        vector=jugadoresEn(70,150,losOtros);
        if (vector.length>0){
            for (int n=0;n<vector.length;n++){
                Point mejorDef=posicionDefensa(vector[n],bola);
                retorno.add(new ComandoIrA(((n+8)>10)?10:n+8,mejorDef.getX(),mejorDef.getY()));
            }
        } else{
            for (int n=8;n<11;n++){
                retorno.add(new ComandoIrA(n,valores[n][0],valores[n][1]));
            }
        }
        int siguienteJugador=sj.getSiguienteJugador(sj.getMasCercanoDeBola());
        siguienteJugador=(siguienteJugador==-1)?10:siguienteJugador;
        retorno.add(new ComandoIrA(sj.getMasCercanoDeBola(),bola.getX(),bola.getY()));
        retorno.add(new ComandoIrA(siguienteJugador,bola.getX(),bola.getY()));
        
        for (int n=0;n<5;n++)
            if (losMios[n].getX()<0)
                retorno.add(new ComandoTiroAPuerta(n,30));
            else
                retorno.add(new ComandoTiroAPuerta(n,-30));
        
        for (int n=5;n<7;n++)
            retorno.add(new ComandoTiroAPuerta(n,15));
        
         retorno.add(new ComandoPase(7,9));
        
        for (int n=8;n<11;n++){
            if ((int)bola.getX()==0 && (int)bola.getY()==0)
                retorno.add(new ComandoPase(n,4));
            else
                if (losMios[n].getX()<0)
                    retorno.add(new ComandoTiroAPuerta(n,16));
                else
                    retorno.add(new ComandoTiroAPuerta(n,-16));
        }
        return retorno;
    }
    private Point[] jugadoresEn(double xIzq,double xDer,Point jugs[]){
        Vector<Point> vector=new Vector();
        for (int i=0;i<jugs.length;i++){
            if (jugs[i].getX()>xIzq && jugs[i].getX()<xDer)
                vector.add(jugs[i]);
        }
        Point[] r=new Point[vector.size()];
        for (int i=0;i<vector.size();i++)
            r[i]=vector.get(i);
        
        return r;
    }
    private Point posicionDefensa(Point jug, Point bola){
        double xR=bola.getX();
        double yR=bola.getY();
        if (jug.getX()> bola.getX())
            xR=jug.getX()-8;
        else
            xR=jug.getX()+8;
        if (jug.getY()> bola.getY())
            yR=jug.getY()-8;
        else
            yR=jug.getY()+8;
        return new Point((int)xR,(int)yR);
    }
    private int losOtrosCerca(Point cont,int[] mios, Vector cubiertos,SituacionJugadores sj){
        int cubre=0;
        for (int m=0;m<mios.length;m++){
            double dist=cont.distance(sj.getMisJugadores()[mios[m]]);
            double distanciaMayor=2000;
            if(!cubiertos.contains((int)mios[m]) && dist<distanciaMayor){
                distanciaMayor=dist;
                cubre=m;
            }
        }
        cubiertos.add((int)mios[cubre]);
        return mios[cubre];
    }
}

